package com.h.chatroom.service.impl;

import com.h.chatroom.mapper.MessageMapper;
import com.h.chatroom.mapper.SessionMapper;
import com.h.chatroom.pojo.dataobject.Friend;
import com.h.chatroom.pojo.dataobject.Session;
import com.h.chatroom.pojo.dataobject.SessionUserItem;
import com.h.chatroom.service.SessionService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Slf4j
@Service
public class SessionServiceImpl implements SessionService {
    @Autowired
    private SessionMapper sessionMapper;

    @Autowired
    private MessageMapper messageMapper;

    @Override
    public List<Session> getSessionList(Integer userId) {
        List<Session> sessions = new ArrayList<>();
        try {
            // 1. 先根据userId 去查询对应的 所有 sessionId
            List<Integer> sessionIds = sessionMapper.selectSessionIdByUserId(userId);
            // 2. 遍历每一个 sessionId 根据 sessionId 去查询对应的 刨除 当前userId 的所有 userId，再去user 中查询对应的用户信息
            for(Integer sessionId : sessionIds) {
                Session session = new Session();
                session.setSessionId(sessionId);
                // 3. 遍历会话id, 查询出每个会话里涉及到的好友都有谁
                List<Friend> friends = sessionMapper.selectFriendBySessionId(sessionId,userId);
                session.setFriends(friends);
                // 4. 遍历会话id, 查询出每个会话的最后一条消息 TODO (这个实现需要等待后面把消息表实现才能做到)
                //    也有可能存在根据对应的 sessionId 查不到对应的信息的情况，比如新创建的会话，还没有进行发信息
                String lastMessage = messageMapper.getLastMessageBySessionId(sessionId);
                if(lastMessage == null) {
                    session.setLastMessage("");
                }else {
                    session.setLastMessage(lastMessage);
                }

                // 5. 把每一个完成的 session 后放到 List 中
                sessions.add(session);
            }
        }catch (NullPointerException e) {
            log.error("获取列表发生错误，e{} " + e);
        }
        return sessions;
    }

    // 添加 事务 操作，让其添加操作是必须全完成才能进行添加，否则是不能添加
    @Transactional
    @Override
    public Map<String, Integer> addSession(Integer toUserId, Integer userId) {
        Map<String,Integer> response = new HashMap<>();
        // 对于会话的创建需要进行三次表的操作
        // 1. 先在 message_session 创建一个新的 会话，并且加上创建的时间，创建一个新的 Session 对象，使用这个参数的目的主要是为了能够获取到会话的 sessionId
        //    也就是说对于 friends 和 lastMessage 是用的
        Session session = new Session();
        sessionMapper.insertSession(session);
        // 因为 关于 会话是需要 两个人或多人 相互发送信息的，所以需要一个会话中，存在多人
        // 2. 创建结束会话后 根据 得到的 sessionId 和 userId 往 message_session_user 中插入新的数据
        SessionUserItem item1 = new SessionUserItem();
        item1.setSessionId(session.getSessionId());
        item1.setUserId(userId);
        sessionMapper.insertSessionUser(item1);
        // 3. 还是需要进行添加另一条数据往 message_session_user 中，属性为 sessionID 和 toUserId
        SessionUserItem item2 = new SessionUserItem();
        item2.setSessionId(session.getSessionId());
        item2.setUserId(toUserId);
        sessionMapper.insertSessionUser(item2);

        log.info("新增会话成功! sessionId = "  +session.getSessionId() + " userId1=" + userId + " userId2=" + toUserId);

        response.put("sessionId", session.getSessionId());
        return response;
    }
}
